package cn.yann.demo.vertx.tcp;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetServerOptions;
import lombok.extern.slf4j.Slf4j;

/**
 * vertx tcp 服务端
 *
 * @author Yann
 */
@Slf4j
public class VertxTcpServeVerticle extends AbstractVerticle {

    private final Integer port;

    private NetServer server;

    public VertxTcpServeVerticle(Integer port) {
        this.port = port;
    }

    /**
     * 启动 vertx-tcp服务
     */
    @Override
    public void start() throws Exception {
        log.debug("vertx - tcp 启动了");
        try {
            NetServerOptions options = new NetServerOptions().setPort(port).setLogActivity(false);
            server = vertx.createNetServer(options);
            // 连接处理器
            server.connectHandler(new T1MsgHandler(vertx));
            // 必须得加 listen 否则无法监听活动 只是创建了一个服务实例
            server.listen(ar -> {
                if (ar.succeeded()) {
                    log.debug("服务器启动成功，端口号为: " + server.actualPort());
                } else {
                    log.debug("服务器启动失败: " + ar.cause());
                }
            });
            log.debug("创建成功net-server服务: {}", server.actualPort());
        } catch (Exception e) {
            log.error("net-server启动出错: {}", e.getMessage());
        }
    }

    /**
     * 关闭 vertx-tcp服务
     */
    @Override
    public void stop() throws Exception {
        log.debug("vertx - tcp 关闭了");
        // 关闭服务处理器
        server.close(v -> log.debug("服务器: {}, 关闭中..", server.actualPort()));
    }
}
